package com.yh.mybatis.reflection.wrapper;

import com.yh.mybatis.reflection.MetaObject;
import com.yh.mybatis.reflection.factory.ObjectFactory;
import com.yh.mybatis.reflection.property.PropertyTokenizer;

import java.util.List;

/**
 * 对象包装器
 *
 * @author yh
 * @date 2023/09/26
 */
public interface ObjectWrapper {

    Object get(PropertyTokenizer prop);

    void set(PropertyTokenizer prop, Object value);

    /**
     * 查询属性
     *
     * @param name                名称
     * @param useCamelCaseMapping 使用camel事例映射
     * @return {@link String}
     */
    String findProperty(String name, boolean useCamelCaseMapping);

    /**
     * 获取getter名称列表
     *
     * @return {@link String[]}
     */
    String[] getGetterNames();

    /**
     * 获取setter名称列表
     *
     * @return {@link String[]}
     */
    String[] getSetterNames();

    /**
     * 获取getter类型
     *
     * @param name 名称
     * @return {@link Class}<{@link ?}>
     */
    Class<?> getGetterType(String name);


    /**
     * 获取setter类型
     *
     * @param name 名称
     * @return {@link Class}<{@link ?}>
     */
    Class<?> getSetterType(String name);


    /**
     * 是否有指定的setter
     *
     * @param name 名称
     * @return boolean
     */
    boolean hasSetter(String name);

    /**
     * 是否有指定的Getter
     *
     * @param name 名称
     * @return boolean
     */
    boolean hasGetter(String name);


    /**
     * 实例化属性值
     *
     * @param name          名称
     * @param prop          道具
     * @param objectFactory 对象工厂
     * @return {@link MetaObject}
     */
    MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory);

    /**
     * 是否是集合
     *
     * @return boolean
     */
    boolean isCollection();

    /**
     * 添加属性
     *
     * @param element 要素
     */
    void add(Object element);

    /**
     * 全部添加
     *
     * @param element 要素
     */
    <E> void addAll(List<E> element);
}
